package aspectj.concert;

import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

/**
 * 用于演示简单通知的切面类
 */
@Aspect //@Aspect注解表明Audience是一个切面
@Component
@Profile("simple")
public class Audience {
    //@Pointcut注解能够在一个@AspectJ切面内定义可重用的切点
    @Pointcut("execution(** concert.Performance.perform(..))")
    public void performance() {
    }


    @Before("performance()")//通知方法会在目标方法调用之前执行
    public void takeSeats() {
        System.out.println("Before....");
    }

    @After("performance()") //通知方法会在目标方法返回后调用，不关心返回的结果，即使是异常也会调用
    public void applauseAfter() {
        System.out.println("After....");
    }

    @AfterReturning("performance()") //通知方法会在目标方法返回后调用，只有在返回成功结果才会调用
    public void applause() {
        System.out.println("AfterReturning....");
    }

    @AfterThrowing("performance()") //通知方法会在目标方法抛出异常后调用
    public void demandRefund() {
        System.out.println("AfterThrowing....");
    }

}
